<?php
/**
 * 存储类 - Mysql
 *
 * @version $Id: LpMysql.php 141 2013-09-30 09:19:11Z linsir123 $
 * @package Store
 */
class LpMysql
{
	/**
	 * 配置
	 *
	 * @var array
	 */
	public $conf;

	/**
	 * 查询次数
	 *
	 * @var int
	 */
	public $queryNum = 0;

	/**
	 * 操作影响行数
	 *
	 * @var int
	 */
	public $affectedRows = 0;

	/**
	 * 插入自增长ID
	 *
	 * @var int
	 */
	public $insertId = 0;

	/**
	 * 结果集
	 *
	 * @var resource
	 */
	private $_res;

	/**
	 * 链接句柄
	 *
	 * @var resource
	 */
	private $_link;

	/**
	 * 构造函数
	 *
	 * @param array $conf 配置
	 *
	 * @throws Exception
	 */
	public function __construct($conf)
	{
		///
		App::$I->getDebugger()->timerStart();

		///
		$this->conf = $conf;
		list($host, $user, $pwd, $dbName, $charset) = $conf;
		if (! $this->_link = @mysql_connect($host, $user, $pwd, true))
			$message = sprintf("[Mysql] %s [%s]", mysql_error(), mysql_errno());
		else {
			if (! @mysql_select_db($dbName, $this->_link))
				$message = sprintf("[Mysql] %s [%s]", mysql_error($this->_link), mysql_errno($this->_link));
		}

		///
		App::$I->getDebugger()->log(sprintf("[Mysql] - Init: %s@%s[%s]", $user, $host, $dbName));

		///
		if (isset($message))
			throw new Exception($message);

		///
		if (! empty($charset))
			$this->_query("SET NAMES '{$charset}'");
	}

	/**
	 * 析构函数
	 */
	public function __destruct()
	{
		if ($this->_link)
			@mysql_close($this->_link);
	}

	/**
	 * // => mysql_query => 分析
	 *
	 * @param string $sql 需要查询的SQL
	 *
	 * @return bool
	 */
	public function query($sql)
	{
		$this->insertId = 0;
		$this->affectedRows = 0;

		///
		if ($this->_query($sql) == false)
			return false;

		///
		$p = "/^\\s*(insert|delete|update|replace) /i";
		if (preg_match($p, $sql, $m)) {
			$type = strtolower($m[1]);
			$this->affectedRows = mysql_affected_rows($this->_link);

			///
			if (in_array($type, array('insert', 'replace')))
				$this->insertId = mysql_insert_id($this->_link);

			///
			return $this->affectedRows;
		}

		///
		return ! empty($this->_res);
	}

	/**
	 * 取得某个值
	 *
	 * @param string $sql 查询SQL
	 * @param int $x 数据集的列号
	 * @param int $y 数据集的行号
	 *
	 * @return string
	 */
	public function getVar($sql, $x = 0, $y = 0)
	{
		if ($this->query($sql)) {
			$i = 0;
			while ($row = @mysql_fetch_row($this->_res)) {
				if ($i ++ == $y)
					return isset($row[$x]) ? $row[$x] : null;
			}

			///
			@mysql_free_result($this->_res);
		}

		return null;
	}

	/**
	 * 取得某列字段值
	 *
	 * @param string $sql 查询SQL
	 * @param int $x 数据集的列号
	 *
	 * @return array
	 */
	public function getCol($sql, $x = 0)
	{
		$list = array();
		if ($this->query($sql)) {
			while ($row = @mysql_fetch_row($this->_res))
				$list[] = isset($row[$x]) ? $row[$x] : null;

			///
			@mysql_free_result($this->_res);
		}

		return $list;
	}

	/**
	 * 取得某行记录
	 *
	 * @param string $sql 查询SQL
	 * @param int $y 数据集的行号
	 *
	 * @return array
	 */
	public function getRow($sql, $y = 0)
	{
		if ($this->query($sql)) {
			$i = 0;
			while ($row = @mysql_fetch_assoc($this->_res)) {
				if ($i ++ == $y)
					return $row;
			}

			///
			@mysql_free_result($this->_res);
		}

		return array();
	}

	/**
	 * 取得查询后的记录集
	 *
	 * @param string $sql 查询SQL
	 *
	 * @return array
	 */
	public function getResults($sql)
	{
		$list = array();
		if ($this->query($sql)) {
			while ($row = @mysql_fetch_assoc($this->_res))
				$list[] = $row;

			///
			@mysql_free_result($this->_res);
		}

		return $list;
	}

	/**
	 * 取得数据库的数据表列表
	 *
	 * @return array
	 */
	public function getTables()
	{
		$list = array();
		if ($this->query('SHOW TABLES')) {
			while ($row = @mysql_fetch_row($this->_res))
				$list[] = $row[0];

			///
			@mysql_free_result($this->_res);
		}

		return $list;
	}

	/**
	 * 取得当前的数据库连接
	 *
	 * @return resource
	 */
	public function getLink()
	{
		return $this->_link;
	}

	/**
	 * 取得当前查询结果集
	 *
	 * @return resource
	 */
	public function getRes()
	{
		return $this->_res;
	}

	/**
	 * 判断某个表是否存在(直接查询时性能更高)
	 *
	 * @param string $table 待查询的数据表名
	 *
	 * @return bool
	 */
	public function existsTable($table)
	{
		$sql = "SELECT 1 FROM `{$table}` LIMIT 0,1";
		$res = @$this->_query($sql);

		///
		return ! empty($res);
	}

	/**
	 * // => mysql_query
	 *
	 * @param string $sql 用于数据操作
	 *
	 * @return resource
	 */
	public function _query($sql)
	{
		///
		App::$I->getDebugger()->timerStart();

		///
		$this->_res = @mysql_query($sql, $this->_link);

		///
		App::$I->getDebugger()->log($sql);

		///
		if (mysql_errno($this->_link) != 0) {
			$content = sprintf("[%s] (%s) - %s",
				mysql_errno($this->_link),
				mysql_error($this->_link),
				$sql);

			trigger_error($content, E_USER_ERROR);

			///
			return false;
		}

		///
		$this->queryNum ++;

		return $this->_res;
	}
}
